#!/usr/bin/env python3
"""
大麦网抢票系统主程序
提供命令行界面和配置管理功能

使用方法:
    python main.py                    # 启动抢票程序
    python main.py --config           # 配置用户信息和抢票参数
    python main.py --test             # 测试浏览器功能
    python main.py --help             # 显示帮助信息
"""

import sys
import os
import argparse
import json
from typing import Dict, Any

# 添加项目根目录到Python路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from src.damai_controller import DamaiTicketController
from utils.common_utils import get_current_time


def print_banner():
    """打印程序横幅"""
    banner = """
╔══════════════════════════════════════════════════════════════════════════════╗
║                            大麦网抢票系统 v1.0                                  ║
║                          Damai Ticket Boost System                          ║
╠══════════════════════════════════════════════════════════════════════════════╣
║  功能特性:                                                                    ║
║  ✓ 自动登录 (账号密码 + 扫码登录)                                               ║
║  ✓ 智能搜索演出                                                               ║
║  ✓ 自动选择场次和票价                                                          ║
║  ✓ 高速抢票引擎                                                               ║
║  ✓ 座位自动选择                                                               ║
║  ✓ 实名制信息填写                                                              ║
║  ✓ 成功通知提醒                                                               ║
╚══════════════════════════════════════════════════════════════════════════════╝
"""
    print(banner)


def configure_system():
    """配置系统"""
    print("\n🔧 系统配置向导")
    print("=" * 50)

    controller = DamaiTicketController()
    template = controller.get_config_template()

    config = {}

    # 配置用户信息
    print("\n📝 第1步: 配置用户信息")
    print("-" * 30)

    config["user"] = {}
    config["user"]["username"] = input("请输入大麦网用户名/手机号/邮箱: ").strip()
    config["user"]["password"] = input("请输入密码: ").strip()
    config["user"]["phone"] = input("请输入手机号码 (用于订单): ").strip()
    config["user"]["real_name"] = input("请输入真实姓名 (实名制): ").strip()
    config["user"]["id_card"] = input("请输入身份证号码 (实名制): ").strip()

    # 配置票务信息
    print("\n🎫 第2步: 配置票务信息")
    print("-" * 30)

    config["ticket"] = {}
    config["ticket"]["event_name"] = input("请输入演出名称: ").strip()

    event_url = input("请输入演出详情页链接 (可选，回车跳过): ").strip()
    config["ticket"]["event_url"] = event_url if event_url else ""

    try:
        session_index = input("请输入场次索引 (0=第一场, 1=第二场..., 默认0): ").strip()
        config["ticket"]["session_index"] = int(session_index) if session_index else 0
    except ValueError:
        config["ticket"]["session_index"] = 0

    try:
        price_index = input(
            "请输入票价索引 (0=第一个票价, 1=第二个票价..., 默认0): "
        ).strip()
        config["ticket"]["price_index"] = int(price_index) if price_index else 0
    except ValueError:
        config["ticket"]["price_index"] = 0

    try:
        ticket_num = input("请输入购票数量 (默认1): ").strip()
        config["ticket"]["ticket_num"] = int(ticket_num) if ticket_num else 1
    except ValueError:
        config["ticket"]["ticket_num"] = 1

    # 配置高级选项
    print("\n⚙️  第3步: 配置高级选项")
    print("-" * 30)
    # 使用模板的默认值
    config["mobile"] = template.get("mobile", {})
    config["retry"] = template["retry"]
    config["notification"] = template["notification"]

    try:
        max_retry = input("请输入最大重试次数 (默认50): ").strip()
        config["retry"]["max_retry_times"] = int(max_retry) if max_retry else 50
    except ValueError:
        config["retry"]["max_retry_times"] = 50

    # 保存配置
    try:
        os.makedirs("config", exist_ok=True)
        with open("config/config.json", "w", encoding="utf-8") as f:
            json.dump(config, f, ensure_ascii=False, indent=2)

        print("\n✅ 配置保存成功!")
        print("配置文件位置: config/config.json")
        print("您可以随时编辑该文件来修改配置")

    except Exception as e:
        print(f"\n❌ 配置保存失败: {e}")
        return False

    return True


def test_mobile():
    """测试移动设备连接功能"""
    print("\n🧪 测试移动设备连接功能")
    print("=" * 50)
    controller = DamaiTicketController()
    try:
        if not controller.initialize():
            print("❌ 系统初始化失败")
            return False
        print("✅ 系统初始化成功")
        if controller.test_device():
            print("✅ 设备连接和App启动测试成功")
            return True
        else:
            print("❌ 设备连接或App启动测试失败")
            return False
    except KeyboardInterrupt:
        print("\n⚠️  用户中断测试")
        return False


def start_ticket_grabbing():
    """开始抢票"""
    print(f"\n🚀 启动抢票程序 - {get_current_time()}")
    print("=" * 50)

    # 检查配置文件
    config_file = "config/config.json"
    if not os.path.exists(config_file):
        print("❌ 未找到配置文件")
        print("请先运行 'python main.py --config' 进行配置")
        return False

    controller = DamaiTicketController()

    try:
        # 初始化系统
        print("正在初始化系统...")
        if not controller.initialize():
            print("❌ 系统初始化失败")
            return False

        print("✅ 系统初始化成功")

        # 开始抢票
        success = controller.run_ticket_grabbing()

        if success:
            print("\n🎉 抢票成功！")
            print("请查看浏览器页面确认订单信息")
        else:
            print("\n😞 抢票失败")
            print("建议检查配置或稍后重试")

        return success

    except KeyboardInterrupt:
        print("\n⚠️  用户中断抢票")
        return False
    except Exception as e:
        print(f"\n❌ 抢票过程出现异常: {e}")
        return False
    finally:
        print("\n按 Enter 键关闭程序...")
        input()
        controller.cleanup()


def show_help():
    """显示帮助信息"""
    help_text = """
使用说明:

1. 首次使用配置系统:
   python main.py --config

2. 开始抢票:
   python main.py

3. 测试设备连接:
    python main.py --test

4. 显示帮助:
   python main.py --help

注意事项:
- 确保安卓设备已连接并开启USB调试
- 建议在演出开票前几分钟启动程序
- 抢票成功后请及时完成支付
- 请遵守大麦网的使用条款

技巧提示:
- 可以提前获取演出名称，避免搜索步骤
- 建议在网络良好的环境下使用
- 热门演出建议多开几个程序并行抢票

配置文件位置: config/config.json
日志文件位置: logs/ticket_boost.log
"""
    print(help_text)


def main():
    """主函数"""
    parser = argparse.ArgumentParser(
        description="大麦网抢票系统",
        formatter_class=argparse.RawDescriptionHelpFormatter,
    )

    parser.add_argument("--config", action="store_true", help="配置系统参数")

    parser.add_argument("--test", action="store_true", help="测试设备连接功能")

    parser.add_argument("--version", action="version", version="大麦网抢票系统 v1.0")

    args = parser.parse_args()

    # 显示横幅
    print_banner()

    try:
        if args.config:
            configure_system()
        elif args.test:
            test_mobile()
        else:
            # 默认启动抢票
            start_ticket_grabbing()

    except KeyboardInterrupt:
        print("\n\n👋 程序已退出")
    except Exception as e:
        print(f"\n❌ 程序执行出错: {e}")
        sys.exit(1)


if __name__ == "__main__":
    main()
